package com.qing.springbootinit.controller;


import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 队列测试
 *
 * @author <a href="https://github.com/qingfengzy">qingfengzy</a>
 */
@RestController
@RequestMapping("/queue")
@Slf4j
@Profile({"dev","local"})
public class QueueController {

    @Resource
    private ThreadPoolExecutor threadPoolExecutor;

    // 自动注入一个线程池的实例
    @GetMapping("/add")
    public void add(String name){
        // 接收一个参数name，然后将任务添加到线程池中

        // 使用CompletableFuture运行一个异步任务
        CompletableFuture.runAsync(()->{
            // 打印一条日志信息，包括任务名称和执行线程的名称
            log.info("任务名称："+ name  + "执行线程:"+ Thread.currentThread().getName());
            // 让线程休眠10分钟，模拟长时间运行的任务
            try {
                Thread.sleep(60000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            // 异步任务在threadPoolExecutor中执行
        },threadPoolExecutor);


    }



    // 该方法返回线程池的状态信息
    @GetMapping("/get")
    public String get(){
        // 创建一个HashMap存储线程池的状态信息
        Map<String,Object> map = new HashMap<>();
        // 获取线程池的队列长度
        map.put("队列长度", threadPoolExecutor.getQueue().size());
        // 将队列长度放入map中
        // 获取线程池已接收的任务总数
        long total = threadPoolExecutor.getTaskCount();
        // 将任务总数放入map中
        map.put("任务总数",total);
        // 获取线程池已完成的任务数
        long finshMission = threadPoolExecutor.getCompletedTaskCount();
        // 将已完成的任务数放入map中
        map.put("完成任务数", finshMission);
        // 获取线程池中正在执行任务的线程数
        long running = threadPoolExecutor.getActiveCount();
        // 将正在工作的线程数放入map中
        map.put("正在进行的进程数",running);
        // 将map转换为JSON字符串并返回
        return JSONUtil.toJsonStr(map);

    }


}
